#pragma once

#include "storage_errors.h"
#include <string>
#include <memory>
#include <functional>
#include "base_noncopyable.h"

namespace El {
namespace Storage {

// 存储设备类型
enum class DeviceType { SD_CARD, USB_DRIVE, EMMC_NAND, ERR_UNKNOWN };

// 文件系统类型
enum class FileSystemType { FAT32, EXFAT, NTFS, ERR_UNKNOWN };

// 容量信息
struct StorageCapacity {
    uint64_t totalBytes;      // 总容量
    uint64_t usedBytes;       // 已使用容量
    uint64_t availableBytes;  // 可用容量
    uint32_t usagePercentage; // 使用百分比，值1~100
};

/**
 * @brief 存储设备接口类
 *
 * 提供存储设备的基本操作和状态查询功能
 */
class IStorageDevice {
public:
    virtual ~IStorageDevice() = default;

    /**
     * @brief 获取设备类型
     * @return DeviceType 设备类型
     */
    virtual DeviceType GetType() const = 0;

    /**
     * @brief 获取设备路径
     * @return std::string 设备路径
     */
    virtual std::string GetDevicePath() const = 0;

    /**
     * @brief 获取挂载点
     * @return std::string 挂载点路径
     */
    virtual std::string GetMountPoint() const = 0;

    /**
     * @brief 获取设备状态
     * @return DeviceStatus 设备当前状态
     */
    virtual DeviceStatus GetStatus() const = 0;

    /**
     * @brief 挂载设备
     * @return bool 操作是否成功
     */
    virtual bool Mount() = 0;

    /**
     * @brief 卸载设备
     * @return bool 操作是否成功
     */
    virtual bool Unmount() = 0;

    /**
     * @brief 格式化设备
     * @param fsType 文件系统类型
     * @return bool 操作是否成功
     */
    virtual bool Format(FileSystemType fsType) = 0;

    /**
     * @brief 获取设备容量信息
     * @return StorageCapacity 容量信息
     */
    virtual StorageCapacity GetCapacity() const = 0;

    /**
     * @brief 修复设备
     * @return bool 操作是否成功
     */
    virtual bool Repair() = 0;

    /**
     * @brief 获取文件系统类型
     * @return FileSystemType 文件系统类型
     */
    virtual FileSystemType GetFileSystemType() const = 0;

    /**
     * @brief 检查文件系统
     * @return bool 操作是否成功
     */
    virtual bool CheckFileSystem() = 0;

    /**
     * @brief 碎片整理
     * @return bool 操作是否成功
     */
    virtual bool Defragment() = 0;
};

} // namespace Storage
} // namespace El
